library(tidyverse)
library(readr)
chic <- read_csv("ggplot2/ggModify/chicago-nmmaps.csv")

# 我们将根据季节类别对数据进行颜色编码。
#   或者用更通俗的说法:我们把季节的变化映射到色彩上。
#   ggplot2的一个优点是，当将变量映射到美学时，它会默认添加一个图例。
#   你可以看到，默认情况下，图例标题就是我们在color参数中指定的:
ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Season")


# 1. 移除图列
# 1.1 全部去除
#   使用 theme(legend.position = "none")
ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.position = "none")

# 1.2 去除一部分
#   可以根据具体情况使用guides(color = "none")或scale_color_discrete(guide = "none")。
#   虽然theme()的更改会一次性删除所有图例，但可以使用后一种选项会删除特定的图例，同时保留其他图例。
#   例如在这里，保留形状的图例，而放弃颜色的图例。
ggplot(chic, aes(
  x = date,
  y = temp,
  color = season,
  shape = season
)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  guides(color = "none")


# 2. 改变图例的位置
#   如果你不想把图例放在右边，就用 theme中的legend.position 参数。
#   在theme中作为图例的位置可以是’top’, ‘bottom’, ‘left’, ‘right'。
ggplot(chic, aes(
  x = date,
  y = temp,
  color = season,
  shape = season
)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.position = "top")

# 也可以在面板中指定一个相对的x和y坐标从0(左或下)到1(右或上)的向量:
ggplot(chic, aes(
  x = date,
  y = temp,
  color = season,
  shape = season
)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(
    legend.position = c(0.2, 0.2),
    legend.background = element_rect(fill = "transparent")
  )


# 3. 改变图例的方向
#   图例的方向默认是垂直的，但当你选择“top”或“bottom”位置时，是水平的。
#   但你也可以随心所欲地改变方向:
ggplot(chic, aes(
  x = date,
  y = temp,
  color = season,
  shape = season
)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(
    legend.position = c(0.5, .95),
    legend.background = element_rect(fill = "transparent")
  ) +
  guides(
    color = guide_legend(direction = "horizontal"),
    shape = guide_legend(title.position = "top", title.hjust = 0.5)
  )


# 4. 改变图例的风格
#   你可以通过调整theme中的legend.title来改变图例标题的外观:
ggplot(chic, aes(
  x = date,
  y = temp,
  color = season,
  shape = season
)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.title = element_text(
    face = "bold",
    color = "chocolate",
    size = 12
  ))


# 5. 改变图例的标题
#   改变图例标题的最简单方法是使用labs():
ggplot(chic, aes(
  x = date,
  y = temp,
  color = season,
  shape = season
)) +
  geom_point() +
  labs(
    x = "Year",
    y = "Temperature (°F)",
    color = "Season",
    shape = "Season\n indicated\n by colors"
  ) +
  theme(legend.title = element_text(
    face = "bold",
    color = "chocolate",
    size = 12
  ))


# 6. 改变图例键值的顺序
#   我们可以通过改变season的不同level来实现:
chic$season <- factor(chic$season, levels = c("winter", "spring", "summer", "autumn"))
ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)")


# 7. 改变图例的标签
#   在scale_color_discrete()中提供一个名称向量，用月份来替换季节
ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  scale_color_discrete(name = "Season", labels = c("冬季", "春季", "夏季", "秋季")) +
  theme(legend.title = element_text(
    face = 2,
    color = "chocolate",
    size = 14
  ))


# 8. 更改图例中的背景
#   为了改变图例键值的背景色(填充)，我们调整theme中legend.key的设置:
ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.key = element_rect(fill = "darkgoldenrod")) +
  scale_color_discrete("Seasons:")
# 如果你想完全去掉它们，可以使用fill = NA或fill = "transparent"。


# 9. 改变图例符号的大小
#   图例中的点在默认大小下可能会丢失一些，特别是没有box的情况下。
#   要覆盖默认图层，可以使用guides图层，如下所示:
ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(
    legend.key = element_rect(fill = NA),
    legend.title = element_text(
      face = "bold",
      color = "chocolate",
      size = 14
    )
  ) +
  scale_color_discrete("Seasons:") +
  guides(color = guide_legend(override.aes = list(size = 6)))


# 10. 手动添加图例项（legend items）
#   ggplot2不会自动添加图例，除非你将外观(颜色，大小等)映射到一个变量。
#   但有时候，我想要一个图例，这样就能清楚地知道你在画什么。
ggplot(chic, aes(x = date, y = o3)) +
  geom_line(color = "gray") +
  geom_point(color = "darkorange2") +
  labs(x = "Year", y = "Ozone")
#   我们可以通过将guide映射到变量来强制生成图例。
#   我们使用aes()映射线和点，我们不是映射到数据集中的一个变量，
#       而是映射到一个字符串(这样我们就得到了每个颜色)。
ggplot(chic, aes(x = date, y = o3)) +
  geom_line(aes(color = "line")) +
  geom_point(aes(color = "points")) +
  labs(x = "Year", y = "Ozone") +
  scale_color_discrete("Type:")
# 要更改颜色，我们使用scale_color_manual()。
# 此外，我们使用guide()函数重写了图列中的美学。
ggplot(chic, aes(x = date, y = o3)) +
  geom_line(aes(color = "line")) +
  geom_point(aes(color = "points")) +
  labs(x = "Year", y = "Ozone") +
  scale_color_manual(name = NULL,
                     guide = "legend",
                     values = c("points" = "darkorange2",
                                "line" = "gray")) +
  guides(color = guide_legend(override.aes = list(linetype = c(1, 0),
                                                  shape = c(NA, 16))))

# 使用其他图例风格
#   就像您在前面的几个例子中看到的那样，像season这样的分类变量的默认图例是guide_legend()。
#   如果你将一个连续变量映射到美学，ggplot2默认将不使用guide_legend()，
#   而是guide_colorbar()(或guide_colourbar()):
ggplot(chic,
       aes(x = date, y = temp, color = temp)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F)")

# 但是，通过使用guide_legend()，你可以强制图例显示离散的颜色，就像分类变量的情况一样:
ggplot(chic,
       aes(x = date, y = temp, color = temp)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F)") +
  guides(color = guide_legend())

# 你也可以用binned scales：
ggplot(chic,
       aes(x = date, y = temp, color = temp)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F)") +
  guides(color = guide_bins())
